package nix.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.junit.Test;

public class Demo1 {

	@Test
	public void fun1() {

		// 获取当前类的ClassLoader
		ClassLoader loader = this.getClass().getClassLoader();
		// 调用处理器
		InvocationHandler h = new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
				System.out.println("你好，动态代理！");
				for (int i = 0; i < args.length; i++) {
					System.out.println(args[i]);
				}
				return "xxx";
			}
		};
		// 创建动态代理对象
		Object o = Proxy.newProxyInstance(loader, new Class[] { A.class,
				B.class }, h);
		// 强转验证
		A a = (A) o;
		B b = (B) o;
		// 代理对象实现所有接口中的方法，方法内容都是调用InvocationHandler的invoke()方法
		// a.a();// 你好，动态代理！
		// a.aa();// 你好，动态代理！
		// b.b();// 你好，动态代理！
		// b.bb();// 你好，动态代理！
		// o.toString();// 你好，动态代理！

		Object o2 = a.aaa("hello", 123);// 你好，动态代理！
		// hello
		// 123
		System.out.println(o2);// xxx
	}
}

interface A {
	public void a();

	public void aa();

	public Object aaa(String s, int i);
}

interface B {
	public void b();

	public void bb();
}
